package com.example.project10;

import android.app.Application;
import android.util.Log;

import androidx.annotation.NonNull;
import androidx.lifecycle.AndroidViewModel;
import androidx.lifecycle.MutableLiveData;

import org.json.JSONException;
import org.json.JSONObject;

public class LoginViewModel extends AndroidViewModel {
    private static final String TAG = "LoginViewModel";
    
    public MutableLiveData<Boolean> isLoading = new MutableLiveData<>();
    public MutableLiveData<String> loginResult = new MutableLiveData<>();
    public MutableLiveData<String> registerResult = new MutableLiveData<>();
    public MutableLiveData<String> autoLoginResult = new MutableLiveData<>();
    
    public LoginViewModel(@NonNull Application application) {
        super(application);
    }
    
    /**
     * 执行登录请求
     * @param email 邮箱
     * @param password 密码
     * @param autoLogin 是否自动登录
     */
    public void login(String email, String password, boolean autoLogin) {
        isLoading.postValue(true);
        
        new Thread(() -> {
            try {
                // 构造请求数据 - 根据API文档，支持username, email, password字段
                JSONObject json = new JSONObject();
                // reqres.in API通常只需要email和password，但为了兼容性我们同时提供username
                json.put("username", email); // 将email作为username
                json.put("email", email);
                json.put("password", password);
                
                // 发送登录请求
                NetworkUtils.ApiResponse response = NetworkUtils.doPostRequest("/login", json.toString());
                
                if (response.success) {
                    // 解析响应数据
                    JSONObject responseObject = new JSONObject(response.data);
                    String token = responseObject.getString("token");
                    
                    // 保存token和自动登录状态
                    SharedPreferencesUtil.saveToken(getApplication(), token);
                    SharedPreferencesUtil.saveAutoLogin(getApplication(), autoLogin);
                    
                    loginResult.postValue("SUCCESS");
                } else {
                    // 解析错误信息
                    try {
                        JSONObject errorObject = new JSONObject(response.errorMessage);
                        String error = errorObject.getString("error");
                        loginResult.postValue("ERROR: " + error);
                    } catch (JSONException e) {
                        loginResult.postValue("ERROR: 登录失败");
                    }
                }
            } catch (Exception e) {
                Log.e(TAG, "Login error", e);
                loginResult.postValue("ERROR: 网络请求失败");
            } finally {
                isLoading.postValue(false);
            }
        }).start();
    }
    
    /**
     * 执行注册请求
     * @param email 邮箱
     * @param password 密码
     */
    public void register(String email, String password) {
        isLoading.postValue(true);
        
        new Thread(() -> {
            try {
                // 构造请求数据 - 根据API文档，支持username, email, password字段
                JSONObject json = new JSONObject();
                // reqres.in API通常只需要email和password，但为了兼容性我们同时提供username
                json.put("username", email); // 将email作为username
                json.put("email", email);
                json.put("password", password);
                
                // 发送注册请求
                NetworkUtils.ApiResponse response = NetworkUtils.doPostRequest("/register", json.toString());
                
                if (response.success) {
                    // 解析响应数据
                    JSONObject responseObject = new JSONObject(response.data);
                    String token = responseObject.getString("token");
                    
                    // 保存token
                    SharedPreferencesUtil.saveToken(getApplication(), token);
                    // 注册成功后默认开启自动登录
                    SharedPreferencesUtil.saveAutoLogin(getApplication(), true);
                    
                    registerResult.postValue("SUCCESS");
                } else {
                    // 解析错误信息
                    try {
                        JSONObject errorObject = new JSONObject(response.errorMessage);
                        String error = errorObject.getString("error");
                        // 检查是否是因为使用了非预定义用户
                        if (error.contains("defined users")) {
                            registerResult.postValue("ERROR: reqres.in只允许预定义用户注册。请使用以下邮箱之一进行测试:\n" +
                                    "• eve.holt@reqres.in (密码: pistol)\n" +
                                    "• george.bluth@reqres.in\n" +
                                    "• janet.weaver@reqres.in\n" +
                                    "• emma.wong@reqres.in\n" +
                                    "• charles.morris@reqres.in\n" +
                                    "• tracey.ramos@reqres.in");
                        } else {
                            registerResult.postValue("ERROR: " + error);
                        }
                    } catch (JSONException e) {
                        registerResult.postValue("ERROR: 注册失败");
                    }
                }
            } catch (Exception e) {
                Log.e(TAG, "Register error", e);
                registerResult.postValue("ERROR: 网络请求失败");
            } finally {
                isLoading.postValue(false);
            }
        }).start();
    }
    
    /**
     * 执行自动登录请求
     */
    public void autoLogin() {
        isLoading.postValue(true);
        
        new Thread(() -> {
            try {
                // 检查是否有保存的token
                String token = SharedPreferencesUtil.getToken(getApplication());
                if (token == null || token.isEmpty()) {
                    autoLoginResult.postValue("ERROR: 未找到保存的token");
                    return;
                }
                
                // 发送自动登录请求（这里使用GET请求模拟）
                NetworkUtils.ApiResponse response = NetworkUtils.doGetRequest("/users/2"); // 使用reqres.in的示例API
                
                if (response.success) {
                    autoLoginResult.postValue("SUCCESS");
                } else {
                    // 检查是否是token过期
                    if (response.errorMessage != null && response.errorMessage.contains("token expired")) {
                        // 尝试刷新token
                        refreshTokenAndRetry();
                    } else {
                        autoLoginResult.postValue("ERROR: 自动登录失败");
                    }
                }
            } catch (Exception e) {
                Log.e(TAG, "Auto login error", e);
                autoLoginResult.postValue("ERROR: 网络请求失败");
            } finally {
                isLoading.postValue(false);
            }
        }).start();
    }
    
    /**
     * 刷新token并重试自动登录
     */
    private void refreshTokenAndRetry() {
        new Thread(() -> {
            try {
                // 获取旧的token
                String oldToken = SharedPreferencesUtil.getToken(getApplication());
                if (oldToken == null || oldToken.isEmpty()) {
                    autoLoginResult.postValue("ERROR: 未找到保存的token");
                    return;
                }
                
                // 构造刷新token的请求数据
                JSONObject json = new JSONObject();
                json.put("token", oldToken);
                
                // 发送刷新token请求（这里使用登录接口模拟）
                NetworkUtils.ApiResponse response = NetworkUtils.doPostRequest("/login", json.toString());
                
                if (response.success) {
                    // 解析响应数据
                    JSONObject responseObject = new JSONObject(response.data);
                    String newToken = responseObject.getString("token");
                    
                    // 保存新token
                    SharedPreferencesUtil.saveToken(getApplication(), newToken);
                    
                    // 重新执行自动登录
                    autoLogin();
                } else {
                    // 刷新token失败，清除本地token
                    SharedPreferencesUtil.clearToken(getApplication());
                    autoLoginResult.postValue("ERROR: Token已过期，请重新登录");
                }
            } catch (Exception e) {
                Log.e(TAG, "Refresh token error", e);
                SharedPreferencesUtil.clearToken(getApplication());
                autoLoginResult.postValue("ERROR: Token刷新失败，请重新登录");
            }
        }).start();
    }
    
    /**
     * 退出登录
     */
    public void logout() {
        SharedPreferencesUtil.clearToken(getApplication());
    }
}